A variety of computer systems are known in the prior art which utilize parallel processing. These systems traditionally require that software be specially designed and written to attempt to take advantage of parallel processing capability. To move software from a single processor environment to a parallel processing environment requires a redesign of the software. Such redesign is labor intensive and serves as a deterrent for owners of applications to migrate their software for use on parallel processing systems.
FIG. 1 represents the relationships among different versions of the same program as it is prepared to run on a single processor computer.
Source code represents a set of computer instructions written in a language which is moderately intelligible to humans. Through the process of compilation, 105, source code is converted into object code 110 which contains machine language instructions for carrying out the statements expressed in source code. Frequently, when using a development system to write, test and debug source code, certain predefined subroutines or functions are invoked which are available in the libraries of the development system. A software developer may also wish to incorporate certain modules previously created and tested by the developer into the program under development. These incorporations can be created by including external "calls" to the subroutines, special functions or library routines in the text of the source code. Such external references are not included in object code but are incorporated into the instructions to be run on a particular computer by the process of linking (115). The linked object code 120 includes all of the code required to execute all of source code and the external subroutines and library functions.
Once the source code has been compiled and linked, it is ready for loading on the target machine where it will be executed. In the process of loading, the instructions are sequentially stored in an instruction memory and variable names which are represented by English like words in the source code are converted to addresses in the memory space of the target machine where the values are to be stored. Commonly, a list of such addresses and variable names are available through the development environment for purposes of testing and debugging.
In the prior art, as indicated above, when attempting to increase the processing power of a computer by providing several parallel processors which operate simultaneously to execute the machine language instructions, a complete redesign of the source code is necessary to take advantage of parallel processing operations. In some environments, source code is changed to include special symbols which indicate which operations are capable of being executed in parallel. In others, certain directives are necessary to allocate instructions to specific ones of the parallel processors.
In the prior art, the problem of synchronizing execution of different branches of the program including fetching instructions and allocating them to the proper microprocessor of a parallel processing system represented a serious design problem. System designers also faced the problem of what to do with conditional jumps when different paths were taken depending on the outcome of a calculation. If one path were assumed and the instructions for that path executed, and the conditional jump decision required taking the other path when it was executed, the calculations previously made would have to be invalidated and processing backup to the point where the correct path could be taken. This undermines the efficiency of parallel processing and is undesirable.